package gui.principal;

import calculadora.Calculadora;
import calculadora.RenglonTrans;
import java.awt.Cursor;
import javax.xml.parsers.ParserConfigurationException;
import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
import org.jdesktop.application.SingleFrameApplication;
import org.jdesktop.application.FrameView;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashMap;
import javax.swing.Timer;
import javax.swing.Icon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import lectores.ExcelMalFormadoException;
import lectores.LectorCondicionesBCalidad;
import lectores.LectorConveniosPrimaDevengada;
import lectores.LectorConveniosPrimaPagada;
import lectores.parsersXLSX.XLSXException;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.util.CellReference;
import org.xml.sax.SAXException;
import salida.GeneraExcel;

public class BonosMultivaGUI extends FrameView {

    JFileChooser selectorDeArchivos = new JFileChooser();
    public File archivoCondiciones = null;
    public File archivoBaseDeDatosPP = null;
    public File archivoBaseDeDatosPD = null;
    int mesSeleccionado;
    //Lectores de archivos
    public static LectorCondicionesBCalidad lectorCondiciones = null;
    public static LectorConveniosPrimaPagada lectorConveniosPP = null;
    public static LectorConveniosPrimaDevengada lectorConveniosPD = null;
    //Calculadora
    Calculadora calculadora;
    //Generador salidas: archivos Excel
    GeneraExcel generadorExcel = null;
    boolean lockGenerador = false;

    public BonosMultivaGUI(SingleFrameApplication app) {
        super(app);
        initComponents();
        getFrame().setResizable(false);
    }

    private File exploraArchivos(boolean seBuscaBase) {
        selectorDeArchivos.setFileFilter(new javax.swing.filechooser.FileFilter() {

            public boolean accept(File f) {
                return f.getName().toLowerCase().endsWith(".xls") || f.isDirectory()
                        || f.getName().toLowerCase().endsWith(".xlsx");
            }

            public String getDescription() {
                return "Archivo Microsoft Excel (.xls o .xlsx)";
            }
        });

        int resp = selectorDeArchivos.showOpenDialog(this.getFrame());
        if (resp == JFileChooser.APPROVE_OPTION) {
            return selectorDeArchivos.getSelectedFile();
        }
        return null;
    }

    private boolean validaCampos() {
        mesSeleccionado = comboMes.getSelectedIndex();
        if (mesSeleccionado == 0 || mesSeleccionado == -1) {
            JOptionPane.showMessageDialog(this.getFrame(), "¡Seleccione el mes a calcular!");
            return false;
        }

        if (archivoCondiciones == null) {
            if ("".equals(campoPathCondiciones.getText())) {
                JOptionPane.showMessageDialog(this.getFrame(), "¡Seleccione el archivo de Condiciones del Mes!");
                return false;
            } else {
                File archivo = new File(campoPathCondiciones.getText());
                if (!campoPathCondiciones.getText().toLowerCase().endsWith(".xls")
                        || !campoPathCondiciones.getText().toLowerCase().endsWith(".xlsx")) {
                    JOptionPane.showMessageDialog(this.getFrame(), "¡El archivo de Condiciones del Mes"
                            + "no es un archivo Excel (.xls o .xlsx)!");
                    return false;
                }
                archivoCondiciones = archivo;
            }
        }

        if (archivoBaseDeDatosPP == null) {
            if ("".equals(campoPathBaseDeDatosPP.getText())) {
                JOptionPane.showMessageDialog(this.getFrame(), "¡Seleccione el archivo de Base de Datos!");
                return false;
            } else {
                File archivo = new File(campoPathBaseDeDatosPP.getText());
                if (!campoPathBaseDeDatosPP.getText().toLowerCase().endsWith(".xls")
                        || !campoPathBaseDeDatosPP.getText().toLowerCase().endsWith(".xlsx")) {
                    JOptionPane.showMessageDialog(this.getFrame(), "¡El archivo de Base de Datos de Convenios"
                            + "no es un archivo Excel (.xls o .xlsx)!");
                    return false;
                }
                archivoCondiciones = archivo;
            }
        }

        if (archivoBaseDeDatosPD == null) {
            if ("".equals(campoPathBaseDeDatosPD.getText())) {
                JOptionPane.showMessageDialog(this.getFrame(), "¡Seleccione el archivo de Base de Datos!");
                return false;
            } else {
                File archivo = new File(campoPathBaseDeDatosPD.getText());
                if (!campoPathBaseDeDatosPD.getText().toLowerCase().endsWith(".xls")
                        || !campoPathBaseDeDatosPD.getText().toLowerCase().endsWith(".xlsx")) {
                    JOptionPane.showMessageDialog(this.getFrame(), "¡El archivo de Base de Datos de Convenios"
                            + "no es un archivo Excel (.xls o .xlsx)!");
                    return false;
                }
                archivoCondiciones = archivo;
            }
        }

        return true;
    }

    private Statement iniciaSesionBase() throws SQLException {
        Connection conexion = DriverManager.getConnection("jdbc:hsqldb:bonos_calidad", "sa", "");
        Statement st = conexion.createStatement();
        return st;
    }

    private ArrayList<Integer> ordena(ArrayList<Integer> lista) {
        Collections.sort(lista);
        return lista;
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        mainPanel = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        panelMes = new javax.swing.JPanel();
        etiquetaMes = new javax.swing.JLabel();
        comboMes = new javax.swing.JComboBox();
        panelCondiciones = new javax.swing.JPanel();
        etiquetaCondiciones = new javax.swing.JLabel();
        campoPathCondiciones = new javax.swing.JTextField();
        botonExplorarCondiciones = new javax.swing.JButton();
        etiquetaEspecificaCondiciones = new javax.swing.JLabel();
        panelBaseDeDatosPP = new javax.swing.JPanel();
        etiquetaBaseDeDatosPP = new javax.swing.JLabel();
        botonExplorarBaseDeDatosPP = new javax.swing.JButton();
        etiquetaEspecificaBaseDDatosPP = new javax.swing.JLabel();
        campoPathBaseDeDatosPP = new javax.swing.JTextField();
        panelBaseDeDatosPD = new javax.swing.JPanel();
        etiquetaBaseDeDatosPD = new javax.swing.JLabel();
        botonExplorarBaseDeDatosPD = new javax.swing.JButton();
        etiquetaEspecificaBaseDDatosPD = new javax.swing.JLabel();
        campoPathBaseDeDatosPD = new javax.swing.JTextField();
        botonCalcular = new javax.swing.JButton();
        botonSalir = new javax.swing.JButton();

        mainPanel.setName("mainPanel"); // NOI18N

        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(bonosmultiva.BonosMultivaApp.class).getContext().getResourceMap(BonosMultivaGUI.class);
        jLabel1.setIcon(resourceMap.getIcon("jLabel1.icon")); // NOI18N
        jLabel1.setName("jLabel1"); // NOI18N

        panelMes.setBorder(javax.swing.BorderFactory.createTitledBorder(resourceMap.getString("panelMes.border.title"))); // NOI18N
        panelMes.setName("panelMes"); // NOI18N

        etiquetaMes.setFont(resourceMap.getFont("etiquetaMes.font")); // NOI18N
        etiquetaMes.setText(resourceMap.getString("etiquetaMes.text")); // NOI18N
        etiquetaMes.setName("etiquetaMes"); // NOI18N

        comboMes.setFont(resourceMap.getFont("comboMes.font")); // NOI18N
        comboMes.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Seleccione el mes...", "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre" }));
        comboMes.setName("comboMes"); // NOI18N

        javax.swing.GroupLayout panelMesLayout = new javax.swing.GroupLayout(panelMes);
        panelMes.setLayout(panelMesLayout);
        panelMesLayout.setHorizontalGroup(
            panelMesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelMesLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelMesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(etiquetaMes)
                    .addComponent(comboMes, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(466, Short.MAX_VALUE))
        );
        panelMesLayout.setVerticalGroup(
            panelMesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelMesLayout.createSequentialGroup()
                .addComponent(etiquetaMes)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(comboMes, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        panelCondiciones.setBorder(javax.swing.BorderFactory.createTitledBorder(resourceMap.getString("panelCondiciones.border.title"))); // NOI18N
        panelCondiciones.setName("panelCondiciones"); // NOI18N

        etiquetaCondiciones.setFont(resourceMap.getFont("etiquetaCondiciones.font")); // NOI18N
        etiquetaCondiciones.setText(resourceMap.getString("etiquetaCondiciones.text")); // NOI18N
        etiquetaCondiciones.setName("etiquetaCondiciones"); // NOI18N

        campoPathCondiciones.setName("campoPathCondiciones"); // NOI18N

        botonExplorarCondiciones.setFont(resourceMap.getFont("botonExplorarCondiciones.font")); // NOI18N
        botonExplorarCondiciones.setText(resourceMap.getString("botonExplorarCondiciones.text")); // NOI18N
        botonExplorarCondiciones.setName("botonExplorarCondiciones"); // NOI18N
        botonExplorarCondiciones.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonExplorarCondicionesActionPerformed(evt);
            }
        });

        etiquetaEspecificaCondiciones.setFont(resourceMap.getFont("etiquetaEspecificaCondiciones.font")); // NOI18N
        etiquetaEspecificaCondiciones.setText(resourceMap.getString("etiquetaEspecificaCondiciones.text")); // NOI18N
        etiquetaEspecificaCondiciones.setName("etiquetaEspecificaCondiciones"); // NOI18N

        javax.swing.GroupLayout panelCondicionesLayout = new javax.swing.GroupLayout(panelCondiciones);
        panelCondiciones.setLayout(panelCondicionesLayout);
        panelCondicionesLayout.setHorizontalGroup(
            panelCondicionesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelCondicionesLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelCondicionesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(etiquetaCondiciones, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(panelCondicionesLayout.createSequentialGroup()
                        .addComponent(campoPathCondiciones, javax.swing.GroupLayout.PREFERRED_SIZE, 497, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(botonExplorarCondiciones))
                    .addComponent(etiquetaEspecificaCondiciones))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        panelCondicionesLayout.setVerticalGroup(
            panelCondicionesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelCondicionesLayout.createSequentialGroup()
                .addComponent(etiquetaCondiciones, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(panelCondicionesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(campoPathCondiciones, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(botonExplorarCondiciones))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(etiquetaEspecificaCondiciones))
        );

        panelBaseDeDatosPP.setBorder(javax.swing.BorderFactory.createTitledBorder(resourceMap.getString("panelBaseDeDatosPP.border.title"))); // NOI18N
        panelBaseDeDatosPP.setName("panelBaseDeDatosPP"); // NOI18N

        etiquetaBaseDeDatosPP.setFont(resourceMap.getFont("etiquetaBaseDeDatosPP.font")); // NOI18N
        etiquetaBaseDeDatosPP.setText(resourceMap.getString("etiquetaBaseDeDatosPP.text")); // NOI18N
        etiquetaBaseDeDatosPP.setName("etiquetaBaseDeDatosPP"); // NOI18N

        botonExplorarBaseDeDatosPP.setFont(resourceMap.getFont("botonExplorarBaseDeDatosPP.font")); // NOI18N
        botonExplorarBaseDeDatosPP.setText(resourceMap.getString("botonExplorarBaseDeDatosPP.text")); // NOI18N
        botonExplorarBaseDeDatosPP.setName("botonExplorarBaseDeDatosPP"); // NOI18N
        botonExplorarBaseDeDatosPP.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonExplorarBaseDeDatosPPActionPerformed(evt);
            }
        });

        etiquetaEspecificaBaseDDatosPP.setFont(resourceMap.getFont("etiquetaEspecificaBaseDDatosPP.font")); // NOI18N
        etiquetaEspecificaBaseDDatosPP.setText(resourceMap.getString("etiquetaEspecificaBaseDDatosPP.text")); // NOI18N
        etiquetaEspecificaBaseDDatosPP.setName("etiquetaEspecificaBaseDDatosPP"); // NOI18N

        campoPathBaseDeDatosPP.setName("campoPathBaseDeDatosPP"); // NOI18N

        javax.swing.GroupLayout panelBaseDeDatosPPLayout = new javax.swing.GroupLayout(panelBaseDeDatosPP);
        panelBaseDeDatosPP.setLayout(panelBaseDeDatosPPLayout);
        panelBaseDeDatosPPLayout.setHorizontalGroup(
            panelBaseDeDatosPPLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelBaseDeDatosPPLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelBaseDeDatosPPLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelBaseDeDatosPPLayout.createSequentialGroup()
                        .addComponent(etiquetaBaseDeDatosPP, javax.swing.GroupLayout.PREFERRED_SIZE, 531, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addContainerGap())
                    .addGroup(panelBaseDeDatosPPLayout.createSequentialGroup()
                        .addComponent(campoPathBaseDeDatosPP, javax.swing.GroupLayout.DEFAULT_SIZE, 496, Short.MAX_VALUE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(botonExplorarBaseDeDatosPP)
                        .addGap(11, 11, 11))
                    .addGroup(panelBaseDeDatosPPLayout.createSequentialGroup()
                        .addComponent(etiquetaEspecificaBaseDDatosPP)
                        .addContainerGap(397, Short.MAX_VALUE))))
        );
        panelBaseDeDatosPPLayout.setVerticalGroup(
            panelBaseDeDatosPPLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelBaseDeDatosPPLayout.createSequentialGroup()
                .addComponent(etiquetaBaseDeDatosPP, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(5, 5, 5)
                .addGroup(panelBaseDeDatosPPLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(campoPathBaseDeDatosPP, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(botonExplorarBaseDeDatosPP))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(etiquetaEspecificaBaseDDatosPP))
        );

        panelBaseDeDatosPD.setBorder(javax.swing.BorderFactory.createTitledBorder(resourceMap.getString("panelBaseDeDatosPD.border.title"))); // NOI18N
        panelBaseDeDatosPD.setName("panelBaseDeDatosPD"); // NOI18N

        etiquetaBaseDeDatosPD.setFont(resourceMap.getFont("etiquetaBaseDeDatosPD.font")); // NOI18N
        etiquetaBaseDeDatosPD.setText(resourceMap.getString("etiquetaBaseDeDatosPD.text")); // NOI18N
        etiquetaBaseDeDatosPD.setName("etiquetaBaseDeDatosPD"); // NOI18N

        botonExplorarBaseDeDatosPD.setFont(resourceMap.getFont("botonExplorarBaseDeDatosPD.font")); // NOI18N
        botonExplorarBaseDeDatosPD.setText(resourceMap.getString("botonExplorarBaseDeDatosPD.text")); // NOI18N
        botonExplorarBaseDeDatosPD.setName("botonExplorarBaseDeDatosPD"); // NOI18N
        botonExplorarBaseDeDatosPD.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonExplorarBaseDeDatosPDActionPerformed(evt);
            }
        });

        etiquetaEspecificaBaseDDatosPD.setFont(resourceMap.getFont("etiquetaEspecificaBaseDDatosPD.font")); // NOI18N
        etiquetaEspecificaBaseDDatosPD.setText(resourceMap.getString("etiquetaEspecificaBaseDDatosPD.text")); // NOI18N
        etiquetaEspecificaBaseDDatosPD.setName("etiquetaEspecificaBaseDDatosPD"); // NOI18N

        campoPathBaseDeDatosPD.setName("campoPathBaseDeDatosPD"); // NOI18N

        javax.swing.GroupLayout panelBaseDeDatosPDLayout = new javax.swing.GroupLayout(panelBaseDeDatosPD);
        panelBaseDeDatosPD.setLayout(panelBaseDeDatosPDLayout);
        panelBaseDeDatosPDLayout.setHorizontalGroup(
            panelBaseDeDatosPDLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelBaseDeDatosPDLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelBaseDeDatosPDLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelBaseDeDatosPDLayout.createSequentialGroup()
                        .addComponent(etiquetaBaseDeDatosPD, javax.swing.GroupLayout.PREFERRED_SIZE, 531, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addContainerGap())
                    .addGroup(panelBaseDeDatosPDLayout.createSequentialGroup()
                        .addComponent(campoPathBaseDeDatosPD, javax.swing.GroupLayout.DEFAULT_SIZE, 496, Short.MAX_VALUE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(botonExplorarBaseDeDatosPD)
                        .addGap(11, 11, 11))
                    .addGroup(panelBaseDeDatosPDLayout.createSequentialGroup()
                        .addComponent(etiquetaEspecificaBaseDDatosPD)
                        .addContainerGap(397, Short.MAX_VALUE))))
        );
        panelBaseDeDatosPDLayout.setVerticalGroup(
            panelBaseDeDatosPDLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelBaseDeDatosPDLayout.createSequentialGroup()
                .addComponent(etiquetaBaseDeDatosPD, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(5, 5, 5)
                .addGroup(panelBaseDeDatosPDLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(campoPathBaseDeDatosPD, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(botonExplorarBaseDeDatosPD))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(etiquetaEspecificaBaseDDatosPD))
        );

        botonCalcular.setFont(resourceMap.getFont("botonCalcular.font")); // NOI18N
        botonCalcular.setText(resourceMap.getString("botonCalcular.text")); // NOI18N
        botonCalcular.setName("botonCalcular"); // NOI18N
        botonCalcular.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonCalcularActionPerformed(evt);
            }
        });

        botonSalir.setFont(resourceMap.getFont("botonSalir.font")); // NOI18N
        botonSalir.setText(resourceMap.getString("botonSalir.text")); // NOI18N
        botonSalir.setName("botonSalir"); // NOI18N
        botonSalir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonSalirActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout mainPanelLayout = new javax.swing.GroupLayout(mainPanel);
        mainPanel.setLayout(mainPanelLayout);
        mainPanelLayout.setHorizontalGroup(
            mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 653, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addGroup(mainPanelLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(panelBaseDeDatosPD, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGap(17, 17, 17))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, mainPanelLayout.createSequentialGroup()
                .addContainerGap(417, Short.MAX_VALUE)
                .addComponent(botonCalcular, javax.swing.GroupLayout.PREFERRED_SIZE, 96, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(botonSalir, javax.swing.GroupLayout.PREFERRED_SIZE, 97, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(37, 37, 37))
            .addGroup(mainPanelLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                    .addComponent(panelMes, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(panelCondiciones, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(panelBaseDeDatosPP, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap(17, Short.MAX_VALUE))
        );
        mainPanelLayout.setVerticalGroup(
            mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(mainPanelLayout.createSequentialGroup()
                .addComponent(jLabel1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(panelMes, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(panelCondiciones, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(panelBaseDeDatosPP, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(panelBaseDeDatosPD, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(botonSalir, javax.swing.GroupLayout.DEFAULT_SIZE, 36, Short.MAX_VALUE)
                    .addComponent(botonCalcular, javax.swing.GroupLayout.PREFERRED_SIZE, 36, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );

        setComponent(mainPanel);
    }// </editor-fold>//GEN-END:initComponents

private void botonExplorarCondicionesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonExplorarCondicionesActionPerformed
    File archivoSeleccionado = exploraArchivos(false);
    if (archivoSeleccionado != null) {
        archivoCondiciones = archivoSeleccionado;
        campoPathCondiciones.setText(archivoCondiciones.getAbsolutePath());
    }
}//GEN-LAST:event_botonExplorarCondicionesActionPerformed

private void botonExplorarBaseDeDatosPPActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonExplorarBaseDeDatosPPActionPerformed
    File archivoSeleccionado = exploraArchivos(true);
    if (archivoSeleccionado != null) {
        archivoBaseDeDatosPP = archivoSeleccionado;
        campoPathBaseDeDatosPP.setText(archivoBaseDeDatosPP.getAbsolutePath());
    }
}//GEN-LAST:event_botonExplorarBaseDeDatosPPActionPerformed

private void botonExplorarBaseDeDatosPDActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonExplorarBaseDeDatosPDActionPerformed
    File archivoSeleccionado = exploraArchivos(true);
    if (archivoSeleccionado != null) {
        archivoBaseDeDatosPD = archivoSeleccionado;
        campoPathBaseDeDatosPD.setText(archivoBaseDeDatosPD.getAbsolutePath());
    }
}//GEN-LAST:event_botonExplorarBaseDeDatosPDActionPerformed

private void botonCalcularActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonCalcularActionPerformed
    if (!lockGenerador) {

        lockGenerador = true;
        botonCalcular.setEnabled(false);

        if (validaCampos()) {
            try {

                //Se le pide al usuario indicar donde se guardara el archivo de salida
                JOptionPane.showMessageDialog(this.getFrame(), "A continuación seleccione donde se guardará el archivo de salida...");
                JFileChooser salvarArchivo = new JFileChooser();
                int respuesta = salvarArchivo.showSaveDialog(getFrame());
                if (respuesta == JFileChooser.APPROVE_OPTION) {
                    File archivoExcelSeleccionado = salvarArchivo.getSelectedFile();
                    String pathName = archivoExcelSeleccionado.getPath();
                    if (!pathName.endsWith(".xls")) {
                        pathName = pathName + ".xls";
                    }

                    //Si el usuario eligio un archivo se comienza a procesar y se pone el cursos en wait
                    mainPanel.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));

                    Statement st = iniciaSesionBase();
                    System.out.println("Lee condiciones");
                    lectorCondiciones = new LectorCondicionesBCalidad(archivoCondiciones);
                    System.out.println("Lee convenios pp");
                    lectorConveniosPP = new LectorConveniosPrimaPagada(archivoBaseDeDatosPP, comboMes.getSelectedIndex(), lectores.LectorConvenios.FILTRO_BONOS_CALIDAD, st);
                    System.out.println("Lee convenios pd");
                    lectorConveniosPD = new LectorConveniosPrimaDevengada(archivoBaseDeDatosPD, comboMes.getSelectedIndex(), lectores.LectorConvenios.FILTRO_BONOS_CALIDAD, st);
                    generadorExcel = new GeneraExcel(pathName);

                    calculadora = new Calculadora(comboMes.getSelectedIndex(), st);

                    //Carga info Acumulado 1
                    calculadora.ejecutaQueryAcuAgente1(st);
                    calculadora.hazCalculosAgente1();
                    calculadora.ejecutaQueryAcuProm1(st);
                    calculadora.hazCalculosPromotor1();

                    ArrayList llavesAgente1 = calculadora.getAcumuladoAgente1();
                    LinkedHashMap<Integer, RenglonTrans> tablaAgente1 = calculadora.getTablaAgente1();
                    ArrayList llavesPromotor1 = calculadora.getAcumuladoPromotor1();
                    LinkedHashMap<Integer, RenglonTrans> tablaPromotor1 = calculadora.getTablaPromotor1();

                    //Carga info Acumulado 2
                    calculadora.ejecutaQueryAcuAgente2(st);
                    calculadora.hazCalculosAgente2();
                    calculadora.ejecutaQueryAcuProm2(st);
                    calculadora.hazCalculosPromotor2();

                    ArrayList llavesPromotor2 = calculadora.getAcumuladoPromotor2();
                    LinkedHashMap<Integer, RenglonTrans> tablaPromotor2 = calculadora.getTablaPromotor2();
                    ArrayList llavesAgente2 = calculadora.getAcumuladoAgente2();
                    LinkedHashMap<Integer, RenglonTrans> tablaAgente2 = calculadora.getTablaAgente2();

                    //Filtro para evitar discrepancias
                    for (int i = 0; i < llavesPromotor1.size(); i++) {
                        Integer intActual = (Integer) llavesPromotor1.get(i);
                        if (!llavesPromotor2.contains(intActual)) {
                            System.out.println("--" + intActual);
                            llavesPromotor2.add(intActual);
                            tablaPromotor1.remove(intActual);
                            tablaPromotor1.put(intActual, new RenglonTrans());
                            tablaPromotor2.remove(intActual);
                            tablaPromotor2.put(intActual, new RenglonTrans());
                        }
                    }

                    for (int i = 0; i < llavesPromotor2.size(); i++) {
                        Integer intActual = (Integer) llavesPromotor2.get(i);
                        if (!llavesPromotor1.contains(intActual)) {
                            System.out.println("--" + intActual);
                            llavesPromotor1.add(intActual);
                            tablaPromotor2.remove(intActual);
                            tablaPromotor2.put(intActual, new RenglonTrans());
                            tablaPromotor1.remove(intActual);
                            tablaPromotor1.put(intActual, new RenglonTrans());
                        }
                    }

                    for (int i = 0; i < llavesAgente1.size(); i++) {
                        Integer intActual = (Integer) llavesAgente1.get(i);
                        if (!llavesAgente2.contains(intActual)) {
                            System.out.println("--" + intActual);
                            llavesAgente2.add(intActual);
                            tablaAgente1.remove(intActual);
                            tablaAgente1.put(intActual, new RenglonTrans());
                            tablaAgente2.remove(intActual);
                            tablaAgente2.put(intActual, new RenglonTrans());
                        }
                    }

                    for (int i = 0; i < llavesAgente2.size(); i++) {
                        Integer intActual = (Integer) llavesAgente2.get(i);
                        if (!llavesAgente1.contains(intActual)) {
                            System.out.println("--" + intActual);
                            llavesAgente1.add(intActual);
                            tablaAgente2.remove(intActual);
                            tablaAgente2.put(intActual, new RenglonTrans());
                            tablaAgente1.remove(intActual);
                            tablaAgente1.put(intActual, new RenglonTrans());
                        }
                    }

                    llavesAgente1 = ordena(llavesAgente1);
                    llavesPromotor1 = ordena(llavesPromotor1);
                    llavesAgente2 = ordena(llavesAgente2);
                    llavesPromotor2 = ordena(llavesPromotor2);

                    //Inicializa la salida
                    generadorExcel.inicializaExcel();

                    System.out.println("---------------------INSERTARA EN AC1: " + llavesPromotor1.size() + " PROMOTORES-----------");
                    Iterator iteProm1 = llavesPromotor1.iterator();
                    while (iteProm1.hasNext()) {
                        RenglonTrans renglonActual = tablaPromotor1.get(iteProm1.next());
                        String[] rengAct = renglonActual.getRenglones();
                        System.out.println("METE EN AC1 PROMOTOR: " + rengAct[1]);
                        generadorExcel.insertaRenglonAc1(rengAct);
                    }

                    System.out.println("---------------------INSERTARA EN AC1: " + llavesAgente1.size() + " AGENTES-----------");
                    Iterator iteAg1 = llavesAgente1.iterator();
                    while (iteAg1.hasNext()) {

                        RenglonTrans renglonActual = tablaAgente1.get(iteAg1.next());
                        String[] rengAct = renglonActual.getRenglones();
                        System.out.println("METE EN AC1 AGENTE: " + rengAct[1]);
                        generadorExcel.insertaRenglonAc1(rengAct);
                    }

                    System.out.println("---------------------INSERTARA EN AC2: " + llavesPromotor2.size() + " PROMOTORES-----------");
                    Iterator iteProm2 = llavesPromotor2.iterator();
                    while (iteProm2.hasNext()) {
                        RenglonTrans renglonActual = tablaPromotor2.get(iteProm2.next());
                        String[] rengAct = renglonActual.getRenglones();
                        System.out.println("METE EN AC2 PROMOTOR: " + rengAct[1]);
                        generadorExcel.insertaRenglonAc2(rengAct);
                    }

                    System.out.println("---------------------INSERTARA EN AC2: " + llavesAgente2.size() + " AGENTES-----------");
                    Iterator iteAg2 = llavesAgente2.iterator();
                    while (iteAg2.hasNext()) {
                        RenglonTrans renglonActual = tablaAgente2.get(iteAg2.next());
                        String[] rengAct = renglonActual.getRenglones();
                        System.out.println("METE EN AC2 AGENTE: " + rengAct[1]);
                        generadorExcel.insertaRenglonAc2(rengAct);
                    }

                    generadorExcel.inicializaHojaCalculo();
                    generadorExcel.llenaHojaCalculo();
                    generadorExcel.generaExcel();
                    JOptionPane.showMessageDialog(this.getFrame(), "¡¡Archivo generado exitosamente!!");
                }

            } catch (FileNotFoundException fnfe) {
                JOptionPane.showMessageDialog(this.getFrame(), "<html><center>¡¡No se encontró alguno de los archivos especificados o tiene el archivo de salida abierto!!<br>"
                        + "Revise y reintente.</center></html>");
            } catch (IOException ioe) {
                JOptionPane.showMessageDialog(this.getFrame(), "<html><center>¡¡Ocurrió un error al leer o escribir alguno de los archivos!!<br>"
                        + "Revise y reintente.</center></html>");
            } catch (SQLException sqle) {
                JOptionPane.showMessageDialog(this.getFrame(), "<html><center>¡¡Hubo un problema al crear la base de datos!!<br>"
                        + "Revise que solo haya una ejecución de este programa y reintente.</center></html>");
            } catch (XLSXException xlsxex) {
            } catch (ExcelMalFormadoException emfe) {
                informaExcelMalFormado(emfe, this.getFrame());
            } catch (InvalidFormatException ife) {
                JOptionPane.showMessageDialog(this.getFrame(), "<html><center>¡¡Alguno de los archivos de Excel está dañado!!<br>"
                        + "Revise y reintente.</center></html>");
            } catch (SAXException saxe) {
                saxe.printStackTrace();
                JOptionPane.showMessageDialog(this.getFrame(), "<html><center>¡¡Alguno de los archivos de Excel está dañado!!<br>"
                        + "Revise y reintente.</center></html>");
            } catch (OpenXML4JException oxml4jex) {
                oxml4jex.printStackTrace();
                JOptionPane.showMessageDialog(this.getFrame(), "<html><center>¡¡Alguno de los archivos de Excel está dañado!!<br>"
                        + "Revise y reintente.</center></html>");
            } catch (ParserConfigurationException pce) {
                pce.printStackTrace();
                JOptionPane.showMessageDialog(this.getFrame(), "<html><center>¡¡Alguno de los archivos de Excel está dañado!!<br>"
                        + "Revise y reintente.</center></html>");
            } catch (Exception ex) {
                ex.printStackTrace();
                JOptionPane.showMessageDialog(this.getFrame(), "<html><center>¡¡Error inesperado!!<br>"
                        + "Revise los archivos y reintente.</center></html>");
            }
        }
        mainPanel.setCursor(Cursor.getDefaultCursor());
        lockGenerador = false;
        botonCalcular.setEnabled(true);
        botonSalir.setText("Salir");
    }
}//GEN-LAST:event_botonCalcularActionPerformed

    public static void informaExcelMalFormado(ExcelMalFormadoException emfe, JFrame frame) {
        if (emfe.getCodigoFallo() == ExcelMalFormadoException.DATO_INESPERADO) {
            switch (emfe.getColFallo()) {
                case 0:
                    JOptionPane.showMessageDialog(frame, "<html><center>¡¡PERIODO ERRONEO O VACÍO!!<br>EL FORMATO ES: AAAA/MM<br>"
                            + "Renglon: " + (emfe.getRengFallo() + 1) + "<br>"
                            + "Columna: " + CellReference.convertNumToColString(emfe.getColFallo()) + "<br>"
                            + "En: " + emfe.getArchivoQueFallo().getName() + "<br>"
                            + "Revise y reintente.</center></html>");
                    break;
                case 2:
                    JOptionPane.showMessageDialog(frame, "<html><center>¡¡ID AGENTE ERRONEO O VACÍO!!<br>"
                            + "Renglon: " + (emfe.getRengFallo() + 1) + "<br>"
                            + "Columna: " + CellReference.convertNumToColString(emfe.getColFallo()) + "<br>"
                            + "En: " + emfe.getArchivoQueFallo().getName() + "<br>"
                            + "Revise y reintente.</center></html>");
                    break;
                case 7:
                    JOptionPane.showMessageDialog(frame, "<html><center>¡¡ID RAMO ERRONEO!!<br>"
                            + "Renglon: " + (emfe.getRengFallo() + 1) + "<br>"
                            + "Columna: " + CellReference.convertNumToColString(emfe.getColFallo()) + "<br>"
                            + "En: " + emfe.getArchivoQueFallo().getName() + "<br>"
                            + "Revise y reintente.</center></html>");
                    break;
                case 12:
                    JOptionPane.showMessageDialog(frame, "<html><center>¡¡ID PROMOTORIA ERRONEO O VACÍO!!<br>"
                            + "Renglon: " + (emfe.getRengFallo() + 1) + "<br>"
                            + "Columna: " + CellReference.convertNumToColString(emfe.getColFallo()) + "<br>"
                            + "En: " + emfe.getArchivoQueFallo().getName() + "<br>"
                            + "Revise y reintente.</center></html>");
                    break;
                case 22:
                    JOptionPane.showMessageDialog(frame, "<html><center>¡¡PRIMA PAGADA ERRONEA!!<br>"
                            + "Renglon: " + (emfe.getRengFallo() + 1) + "<br>"
                            + "Columna: " + CellReference.convertNumToColString(emfe.getColFallo()) + "<br>"
                            + "En: " + emfe.getArchivoQueFallo().getName() + "<br>"
                            + "Revise y reintente.</center></html>");
                    break;
                case 37:
                    JOptionPane.showMessageDialog(frame, "<html><center>¡¡SINIESTRO TOTAL ERRONEO!!<br>"
                            + "Renglon: " + (emfe.getRengFallo() + 1) + "<br>"
                            + "Columna: " + CellReference.convertNumToColString(emfe.getColFallo()) + "<br>"
                            + "En: " + emfe.getArchivoQueFallo().getName() + "<br>"
                            + "Revise y reintente.</center></html>");
                    break;
                default:
                    JOptionPane.showMessageDialog(frame, "<html><center>¡¡Dato inesperado!!<br>"
                            + "Renglon: " + (emfe.getRengFallo() + 1) + "<br>"
                            + "Columna: " + CellReference.convertNumToColString(emfe.getColFallo()) + "<br>"
                            + "En: " + emfe.getArchivoQueFallo().getName() + "<br>"
                            + "Revise y reintente.</center></html>");
                    break;
            }
        }
        else if (emfe.getCodigoFallo() == ExcelMalFormadoException.FALTA_COLUMNA) {
                JOptionPane.showMessageDialog(frame, "<html><center>¡¡Falta o sobra una columna!!<br>"
                        + "En: " + emfe.getArchivoQueFallo().getName() + "<br>"
                        + "Revise y reintente.</center></html>");
            } else if (emfe.getCodigoFallo() == ExcelMalFormadoException.TIPO_INESPERADO) {
                JOptionPane.showMessageDialog(frame, "<html><center>¡¡Tipo inesperado en la celda!!<br>"
                        + "Renglon: " + (emfe.getRengFallo() + 1) + "<br>"
                        + "Columna: " + CellReference.convertNumToColString(emfe.getColFallo()) + "<br>"
                        + "En: " + emfe.getArchivoQueFallo().getName() + "<br>"
                        + "Revise y reintente.</center></html>");
            } else if (emfe.getCodigoFallo() == ExcelMalFormadoException.RENGLON_VACIO) {
                JOptionPane.showMessageDialog(frame, "<html><center>¡¡Hubo un renglon vacío!!<br>"
                        + "Renglon: " + CellReference.convertNumToColString(emfe.getRengFallo()) + "<br>"
                        + "En: " + emfe.getArchivoQueFallo().getName() + "<br>"
                        + "Revise y reintente.</center></html>");
            } else if (emfe.getCodigoFallo() == ExcelMalFormadoException.MES_NO_ENCONTRADO) {
                JOptionPane.showMessageDialog(frame, "<html><center>¡¡No se encontraron registros del mes seleccionado!!<br>"
                        + "En: " + emfe.getArchivoQueFallo().getName() + "<br>"
                        + "Revise y reintente.</center></html>");
            }
            if (emfe.getCodigoFallo() == ExcelMalFormadoException.CONDICIONES) {
                int caso = emfe.getColFallo();
                if (caso >= 5 & caso < 59) {
                    caso = 5;
                }
                if (caso >= 60 & caso < 72) {
                    caso = 5;
                }
                switch (caso) {
                    case 0:
                        JOptionPane.showMessageDialog(frame, "<html><center>¡¡TIPO ERRONEO O VACÍO!!<br>"
                                + "Renglon: " + (emfe.getRengFallo() + 1) + "<br>"
                                + "Columna: " + CellReference.convertNumToColString(emfe.getColFallo()) + "<br>"
                                + "En: " + emfe.getArchivoQueFallo().getName() + "<br>"
                                + "Revise y reintente.</center></html>");
                        break;
                    case 1:
                        JOptionPane.showMessageDialog(frame, "<html><center>¡¡ID AGENTE ERRONEO O VACÍO!!<br>"
                                + "Renglon: " + (emfe.getRengFallo() + 1) + "<br>"
                                + "Columna: " + CellReference.convertNumToColString(emfe.getColFallo()) + "<br>"
                                + "En: " + emfe.getArchivoQueFallo().getName() + "<br>"
                                + "Revise y reintente.</center></html>");
                        break;
                    case 5:
                        JOptionPane.showMessageDialog(frame, "<html><center>¡¡PORCENTAJE ERRONEO!!<br>"
                                + "Renglon: " + (emfe.getRengFallo() + 1) + "<br>"
                                + "Columna: " + CellReference.convertNumToColString(emfe.getColFallo()) + "<br>"
                                + "En: " + emfe.getArchivoQueFallo().getName() + "<br>"
                                + "Revise y reintente.</center></html>");
                        break;
                    case 2:
                        JOptionPane.showMessageDialog(frame, "<html><center>¡¡ID PROMOTORIA ERRONEO O VACÍO!!<br>"
                                + "Renglon: " + (emfe.getRengFallo() + 1) + "<br>"
                                + "Columna: " + CellReference.convertNumToColString(emfe.getColFallo()) + "<br>"
                                + "En: " + emfe.getArchivoQueFallo().getName() + "<br>"
                                + "Revise y reintente.</center></html>");
                        break;
                    case 59:
                        JOptionPane.showMessageDialog(frame, "<html><center>¡¡RECHAZOS ERRONEO!!<br>"
                                + "Renglon: " + (emfe.getRengFallo() + 1) + "<br>"
                                + "Columna: " + CellReference.convertNumToColString(emfe.getColFallo()) + "<br>"
                                + "En: " + emfe.getArchivoQueFallo().getName() + "<br>"
                                + "Revise y reintente.</center></html>");
                        break;
                    case 60:
                        JOptionPane.showMessageDialog(frame, "<html><center>¡¡META DEL MES ERRONEA!!<br>"
                                + "Renglon: " + (emfe.getRengFallo() + 1) + "<br>"
                                + "Columna: " + CellReference.convertNumToColString(emfe.getColFallo()) + "<br>"
                                + "En: " + emfe.getArchivoQueFallo().getName() + "<br>"
                                + "Revise y reintente.</center></html>");
                        break;
                    case 72:
                        JOptionPane.showMessageDialog(frame, "<html><center>¡¡MES ANUAL ERRONE0!!<br>"
                                + "Renglon: " + (emfe.getRengFallo() + 1) + "<br>"
                                + "Columna: " + CellReference.convertNumToColString(emfe.getColFallo()) + "<br>"
                                + "En: " + emfe.getArchivoQueFallo().getName() + "<br>"
                                + "Revise y reintente.</center></html>");
                        break;
                    case 73:
                        JOptionPane.showMessageDialog(frame, "<html><center>¡¡ID ADICIONAL 1 ERRONE0!!<br>"
                                + "Renglon: " + (emfe.getRengFallo() + 1) + "<br>"
                                + "Columna: " + CellReference.convertNumToColString(emfe.getColFallo()) + "<br>"
                                + "En: " + emfe.getArchivoQueFallo().getName() + "<br>"
                                + "Revise y reintente.</center></html>");
                        break;
                    case 74:
                        JOptionPane.showMessageDialog(frame, "<html><center>¡¡ID ADICIONAL 2 ERRONE0!!<br>"
                                + "Renglon: " + (emfe.getRengFallo() + 1) + "<br>"
                                + "Columna: " + CellReference.convertNumToColString(emfe.getColFallo()) + "<br>"
                                + "En: " + emfe.getArchivoQueFallo().getName() + "<br>"
                                + "Revise y reintente.</center></html>");
                        break;
                    default:
                        JOptionPane.showMessageDialog(frame, "<html><center>¡¡Dato inesperado!!<br>"
                                + "Renglon: " + (emfe.getRengFallo() + 1) + "<br>"
                                + "Columna: " + CellReference.convertNumToColString(emfe.getColFallo()) + "<br>"
                                + "En: " + emfe.getArchivoQueFallo().getName() + "<br>"
                                + "Revise y reintente.</center></html>");
                        break;
                }
            }
            else if (emfe.getCodigoFallo() == ExcelMalFormadoException.FALTA_COLUMNA) {
                JOptionPane.showMessageDialog(frame, "<html><center>¡¡Falta una columna!!<br>"
                        + "En: " + emfe.getArchivoQueFallo().getName() + "<br>"
                        + "Revise y reintente.</center></html>");
            } else if (emfe.getCodigoFallo() == ExcelMalFormadoException.TIPO_INESPERADO) {
                JOptionPane.showMessageDialog(frame, "<html><center>¡¡Tipo inesperado en la celda!!<br>"
                        + "Renglon: " + (emfe.getRengFallo() + 1) + "<br>"
                        + "Columna: " + CellReference.convertNumToColString(emfe.getColFallo()) + "<br>"
                        + "En: " + emfe.getArchivoQueFallo().getName() + "<br>"
                        + "Revise y reintente.</center></html>");
            } else if (emfe.getCodigoFallo() == ExcelMalFormadoException.RENGLON_VACIO) {
                JOptionPane.showMessageDialog(frame, "<html><center>¡¡Hubo un renglon vacío!!<br>"
                        + "Renglon: " + CellReference.convertNumToColString(emfe.getRengFallo()) + "<br>"
                        + "En: " + emfe.getArchivoQueFallo().getName() + "<br>"
                        + "Revise y reintente.</center></html>");
            } else if (emfe.getCodigoFallo() == ExcelMalFormadoException.MES_NO_ENCONTRADO) {
                JOptionPane.showMessageDialog(frame, "<html><center>¡¡No se encontraron registros del mes seleccionado!!<br>"
                        + "En: " + emfe.getArchivoQueFallo().getName() + "<br>"
                        + "Revise y reintente.</center></html>");
            }
            if (emfe.getCodigoFallo() == ExcelMalFormadoException.DEVENGADO) {
            switch (emfe.getColFallo()) {
                case 0:
                    JOptionPane.showMessageDialog(frame, "<html><center>¡¡PERIODO ERRONEO O VACÍO!!<br>EL FORMATO ES: AAAA/MM<br>"
                            + "Renglon: " + (emfe.getRengFallo() + 1) + "<br>"
                            + "Columna: " + CellReference.convertNumToColString(emfe.getColFallo()) + "<br>"
                            + "En: " + emfe.getArchivoQueFallo().getName() + "<br>"
                            + "Revise y reintente.</center></html>");
                    break;
                case 2:
                    JOptionPane.showMessageDialog(frame, "<html><center>¡¡ID AGENTE ERRONEO O VACÍO!!<br>"
                            + "Renglon: " + (emfe.getRengFallo() + 1) + "<br>"
                            + "Columna: " + CellReference.convertNumToColString(emfe.getColFallo()) + "<br>"
                            + "En: " + emfe.getArchivoQueFallo().getName() + "<br>"
                            + "Revise y reintente.</center></html>");
                    break;
                case 7:
                    JOptionPane.showMessageDialog(frame, "<html><center>¡¡ID RAMO ERRONEO!!<br>"
                            + "Renglon: " + (emfe.getRengFallo() + 1) + "<br>"
                            + "Columna: " + CellReference.convertNumToColString(emfe.getColFallo()) + "<br>"
                            + "En: " + emfe.getArchivoQueFallo().getName() + "<br>"
                            + "Revise y reintente.</center></html>");
                    break;
                case 12:
                    JOptionPane.showMessageDialog(frame, "<html><center>¡¡ID PROMOTORIA ERRONEO O VACÍO!!<br>"
                            + "Renglon: " + (emfe.getRengFallo() + 1) + "<br>"
                            + "Columna: " + CellReference.convertNumToColString(emfe.getColFallo()) + "<br>"
                            + "En: " + emfe.getArchivoQueFallo().getName() + "<br>"
                            + "Revise y reintente.</center></html>");
                    break;
                case 22:
                    JOptionPane.showMessageDialog(frame, "<html><center>¡¡PRIMA PAGADA DEVENGADA ERRONEA!!<br>"
                            + "Renglon: " + (emfe.getRengFallo() + 1) + "<br>"
                            + "Columna: " + CellReference.convertNumToColString(emfe.getColFallo()) + "<br>"
                            + "En: " + emfe.getArchivoQueFallo().getName() + "<br>"
                            + "Revise y reintente.</center></html>");
                    break;
                default:
                    JOptionPane.showMessageDialog(frame, "<html><center>¡¡Dato inesperado!!<br>"
                            + "Renglon: " + (emfe.getRengFallo() + 1) + "<br>"
                            + "Columna: " + CellReference.convertNumToColString(emfe.getColFallo()) + "<br>"
                            + "En: " + emfe.getArchivoQueFallo().getName() + "<br>"
                            + "Revise y reintente.</center></html>");
                    break;
            }
        }
            else if (emfe.getCodigoFallo() == ExcelMalFormadoException.FALTA_COLUMNA) {
                JOptionPane.showMessageDialog(frame, "<html><center>¡¡Falta una columna!!<br>"
                        + "En: " + emfe.getArchivoQueFallo().getName() + "<br>"
                        + "Revise y reintente.</center></html>");
            } else if (emfe.getCodigoFallo() == ExcelMalFormadoException.TIPO_INESPERADO) {
                JOptionPane.showMessageDialog(frame, "<html><center>¡¡Tipo inesperado en la celda!!<br>"
                        + "Renglon: " + (emfe.getRengFallo() + 1) + "<br>"
                        + "Columna: " + CellReference.convertNumToColString(emfe.getColFallo()) + "<br>"
                        + "En: " + emfe.getArchivoQueFallo().getName() + "<br>"
                        + "Revise y reintente.</center></html>");
            } else if (emfe.getCodigoFallo() == ExcelMalFormadoException.RENGLON_VACIO) {
                JOptionPane.showMessageDialog(frame, "<html><center>¡¡Hubo un renglon vacío!!<br>"
                        + "Renglon: " + CellReference.convertNumToColString(emfe.getRengFallo()) + "<br>"
                        + "En: " + emfe.getArchivoQueFallo().getName() + "<br>"
                        + "Revise y reintente.</center></html>");
            } else if (emfe.getCodigoFallo() == ExcelMalFormadoException.MES_NO_ENCONTRADO) {
                JOptionPane.showMessageDialog(frame, "<html><center>¡¡No se encontraron registros del mes seleccionado!!<br>"
                        + "En: " + emfe.getArchivoQueFallo().getName() + "<br>"
                        + "Revise y reintente.</center></html>");
            }
        }

private void botonSalirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonSalirActionPerformed
    System.exit(0);
}//GEN-LAST:event_botonSalirActionPerformed
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton botonCalcular;
    private javax.swing.JButton botonExplorarBaseDeDatosPD;
    private javax.swing.JButton botonExplorarBaseDeDatosPP;
    private javax.swing.JButton botonExplorarCondiciones;
    private javax.swing.JButton botonSalir;
    private javax.swing.JTextField campoPathBaseDeDatosPD;
    private javax.swing.JTextField campoPathBaseDeDatosPP;
    private javax.swing.JTextField campoPathCondiciones;
    private javax.swing.JComboBox comboMes;
    private javax.swing.JLabel etiquetaBaseDeDatosPD;
    private javax.swing.JLabel etiquetaBaseDeDatosPP;
    private javax.swing.JLabel etiquetaCondiciones;
    private javax.swing.JLabel etiquetaEspecificaBaseDDatosPD;
    private javax.swing.JLabel etiquetaEspecificaBaseDDatosPP;
    private javax.swing.JLabel etiquetaEspecificaCondiciones;
    private javax.swing.JLabel etiquetaMes;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JPanel mainPanel;
    private javax.swing.JPanel panelBaseDeDatosPD;
    private javax.swing.JPanel panelBaseDeDatosPP;
    private javax.swing.JPanel panelCondiciones;
    private javax.swing.JPanel panelMes;
    // End of variables declaration//GEN-END:variables
    private Timer messageTimer;
    private Timer busyIconTimer;
    private Icon idleIcon;
    private Icon[] busyIcons = new Icon[15];
    private int busyIconIndex = 0;
}
